--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / community_interfaces.py
Displaying Raw • Download
meshchatx/src/backend/community_interfaces.py c0b0ddffd735a0d007c1be9a5e8563ec42fdafc0 (c0b0ddff) Text, 4.73 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787json
Tff7b72from T7ee787datetime Tff7b72import Te6edf3UTCTb4b4b4, Te6edf3datetime
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any
Te6edf3_BUNDLED Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparent Tff7b72/ Ta5d6ff"Ta5d6ffdataTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffcommunity_interfaces.jsonTa5d6ff"
Tff7b72class T56d364CommunityInterfacesManagerTb4b4b4:
T8b949e"""Load suggested interface presets from cache, public override, or bundled data."""
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3public_override_pathTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3cache_pathTb4b4b4: Tffa657str Tff7b72| Te6edf3Path Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_public_override_path Tff7b72= Te6edf3public_override_path
Tff7b72selfTff7b72.Td2a8ff_cache_path Tff7b72= Te6edf3PathTb4b4b4(Te6edf3cache_pathTb4b4b4) Tff7b72if Te6edf3cache_path Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffinterfaces Tff7b72= Tff7b72selfTff7b72.Td2a8ff_load_rawTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_candidate_pathsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Te6edf3PathTb4b4b4]Tb4b4b4:
Te6edf3pathsTb4b4b4: Tffa657listTb4b4b4[Te6edf3PathTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_public_override_pathTb4b4b4:
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3PathTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_public_override_pathTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_cache_pathTb4b4b4:
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_cache_pathTb4b4b4)
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3_BUNDLEDTb4b4b4)
Tff7b72return Te6edf3paths
Tff7b72def Td2a8ff_load_rawTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Tff7b72for Te6edf3path Tff7b72in Tff7b72selfTff7b72.Td2a8ff_candidate_pathsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3pathTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3doc Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149OSErrorTb4b4b4, Tf85149UnicodeErrorTb4b4b4, Te6edf3jsonTff7b72.Td2a8ffJSONDecodeErrorTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3raw Tff7b72= Te6edf3docTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4, Te6edf3docTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3docTb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Te6edf3doc
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3rawTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3normalized Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ff_normalize_entryTb4b4b4(Te6edf3xTb4b4b4) Tff7b72for Te6edf3x Tff7b72in Te6edf3raw Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3xTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4]
Tff7b72if Te6edf3normalizedTb4b4b4:
Tff7b72return Te6edf3normalized
Tff7b72return Tb4b4b4[Tb4b4b4]
Tf0883e@staticmethod
Tff7b72def Td2a8ff_normalize_entryTb4b4b4(Te6edf3itemTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787interface_editor Tff7b72import Te6edf3InterfaceEditor
Te6edf3out Tff7b72= Tffa657dictTb4b4b4(Te6edf3itemTb4b4b4)
Te6edf3name Tff7b72= Te6edf3InterfaceEditorTff7b72.Td2a8ffsanitize_interface_section_nameTb4b4b4(Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3nameTb4b4b4:
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3name
Te6edf3iface_type Tff7b72= Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3iface_type Tff7b72== Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4:
Te6edf3remote Tff7b72= Tb4b4b4(Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3remoteTb4b4b4:
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3remote
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3remote
Te6edf3tp Tff7b72= Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3tp Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3tp Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4] Tff7b72= Tffa657intTb4b4b4(Te6edf3tpTb4b4b4)
Tff7b72elif Te6edf3iface_type Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4:
Te6edf3peers Tff7b72= Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffi2p_peersTa5d6ff"Tb4b4b4) Tff7b72or Tb4b4b4[Tb4b4b4]
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3peersTb4b4b4, Tffa657listTb4b4b4) Tff7b72and Te6edf3peersTb4b4b4:
Te6edf3cleaned Tff7b72= Tb4b4b4[Tffa657strTb4b4b4(Te6edf3pTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3p Tff7b72in Te6edf3peers Tff7b72if Tffa657strTb4b4b4(Te6edf3pTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4]
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6ffi2p_peersTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cleaned
Tff7b72if Te6edf3cleanedTb4b4b4:
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cleanedTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fftarget_portTa5d6ff" Tff7b72not Tff7b72in Te6edf3outTb4b4b4:
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72elif Te6edf3iface_type Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4:
Te6edf3th Tff7b72= Tb4b4b4(Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3thTb4b4b4:
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3th
Te6edf3tp Tff7b72= Te6edf3outTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3tp Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3tp Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3outTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4] Tff7b72= Tffa657intTb4b4b4(Te6edf3tpTb4b4b4)
Tff7b72return Te6edf3out
Tff7b72def Td2a8ffrefresh_from_directoryTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3urlTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff60.0Tb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787community_interfaces_directory Tff7b72import Tb4b4b4(
Te6edf3build_interfaces_from_directory_urlTb4b4b4,
Tb4b4b4)
Te6edf3interfacesTb4b4b4, Te6edf3resolved_url Tff7b72= Te6edf3build_interfaces_from_directory_urlTb4b4b4(
Te6edf3urlTb4b4b4,
Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3interfacesTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDirectory returned no usable interface presetsTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_cache_pathTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_cache_pathTff7b72.Td2a8ffparentTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3doc Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ff_commentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMeshChatX cache from in-app directory refresh. Load order is public Ta5d6ff"
Ta5d6ff"Ta5d6ffcommunity_interfaces.json, then this cache, then bundled presets.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff_sourceTa5d6ff"Tb4b4b4: Te6edf3resolved_urlTb4b4b4,
Ta5d6ff"Ta5d6ff_refreshed_atTa5d6ff"Tb4b4b4: Te6edf3datetimeTff7b72.Td2a8ffnowTb4b4b4(Te6edf3UTCTb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3microsecondTff7b72=T79c0ff0Tb4b4b4)Tff7b72.Td2a8ffisoformatTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Te6edf3interfacesTb4b4b4,
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_cache_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3docTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4, Te6edf3ensure_asciiTff7b72=Tff7b72FalseTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterfaces Tff7b72= Tff7b72selfTff7b72.Td2a8ff_load_rawTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffinterfaces Tff7b72= Tb4b4b4[
Tff7b72selfTff7b72.Td2a8ff_normalize_entryTb4b4b4(Tffa657dictTb4b4b4(Te6edf3xTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3x Tff7b72in Te6edf3interfaces
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3xTb4b4b4, Tffa657dictTb4b4b4)
Tb4b4b4]
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo interface presets after refreshTa5d6ff"Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinterfacesTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Te6edf3resolved_urlTb4b4b4}
Tff7b72async Tff7b72def Td2a8ffget_interfacesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4{Tff7b72*Tff7b72*Te6edf3ifaceTb4b4b4, Ta5d6ff"Ta5d6ffonlineTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6fflast_checkTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4} Tff7b72for Te6edf3iface Tff7b72in Tff7b72selfTff7b72.Td2a8ffinterfacesTb4b4b4]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────